# 1，类方法：类对象所拥有的方法，需要用修饰器@classmethod来标识其为类方法，对于类方法，第一个参数必须是类对象，
# 一般以类对象cls作为第一个参数，通过cls引用类对象的属性和方法。类方法可以通过类对象，实例对象调用。
# 2，实例方法的第一个参数必须是self，通过这个self可以去引用类属性或实例属性，若存在相同名称实例属性和类属性的话，实例属性优先级最高
# 3，静态方法需要用修饰器@staticmethod来修饰，静态方法不需要定义额外的参数如cls，self，若要引用属性的话，则可以通过类对象或者是实例对象去引用即可
class People:
    country='china'
    @classmethod #类方法用classmethod来修饰
    def get_country(cls):
        return cls.country #访问类属性
        pass
    pass
    @classmethod #类方法
    def change_country(cls,date):
        cls.country=date #通过类方法修改类属性的值
        pass
    @staticmethod #静态方法
    def getData():
        return People.country
    pass
    @staticmethod
    def add(x,y):
        return x+y
    pass
print(People.add(10,56)) #带有参数的静态方法
print(People.get_country()) #通过类对象调用的类方法来访问类属性
p=People()
print('实例对象访问',p.get_country())
print('---------修改后的数据----------')
People.change_country('英国') #调用能修改类属性的类方法
print(People.get_country()) #通过类对象调用的类方法访问修改后的数据
# 静态方法：类对象所拥有的方法，需要用@staticmethod来表示静态方法，静态方法不需要任何参数。
print(People.getData()) #通过类对象访问静态方法
print(p.getData()) #通过实例对象访问静态方法，但通常不会通过实例对象访问静态方法
# 为什么要使用静态方法呢？
# 由于静态方法主要来存放逻辑性的代码，本身和类以及实例对象没有交互，独立于类以及实例对象，也就是说静态方法更接近于普通函数，但位于类的定义中，表示与类有逻辑关系的操作，在静态方法中，不会涉及到类中方法和属性的操作，不需要额外定义参数如cls，self
# 数据资源能够得到有效的充分利用
# demo 返回当前的系统时间
import time # 引入第三方的时间模块
class TimeTest:
    def __init__(self,hour,min,second):
        self.hour = hour
        self.min = min
        self.second = second
    @staticmethod
    def showTime():
        return time.strftime('%H:%M:%S',time.localtime())
print(TimeTest.showTime()) #通过类对象访问静态方法
t=TimeTest(2,10,15)
print(t.showTime()) #没有必要通过实例对象访问静态方法

